function resolveAfter2Seconds(x) {
    return new Promise((resolve) => {
        setTimeout(() => {
            resolve(x);
        }, 2000);
    });
}

// async function expression assigned to a variable
const add = async function (x) {
    const a = await resolveAfter2Seconds(20);
    const b = await resolveAfter2Seconds(30);
    return x + a + b;
};

add(10).then((v) => {
    console.log(v); // prints 60 after 4 seconds.
});

// async function expression used as an IIFE
(async function (x) {
    const p1 = resolveAfter2Seconds(20);
    const p2 = resolveAfter2Seconds(30);
    return x + (await p1) + (await p2);
})(10).then((v) => {
    console.log(v); // prints 60 after 2 seconds.
});
